(function(){

  class Person{
    // ts可以在属性前添加属性的修饰符
    /* 
      public  修饰的属性可以在任意位置访问（修改） 默认值 true
      private   私有属性，私有属性只能在类内部进行访问（修改）
              --通过在类中添加方法使得私有属性可以被外部访问（修改）
      protected   受保护的属性，只能在当前类和自雷中访问（修改）
    */
    private _name:string
    private _age:number

    constructor(name:string , age:number){
      this._name = name
      this._age = age
    }

    // 定义方法，用来获取name属性
    // getName(){
    //   return this._name
    // }
    // // 定义方法，用来修改name属性
    // setName(value:string){
    //   this._name = value
    // }

    // setAge(value:number){
    //   if(value >= 0){
    //     this._age = value
    //   }
    // }

    // TS中设置getter方法的方式
    get name(){
      return this._name
    }

    set name(value:string){
      this._name = value
    }

    get age(){
      return this._age
    }

    set age(value:number){
      if(value >= 0 ){
        this._age = value
      }
    }

  }

  const per = new Person('孙悟空',18)

  // per.setName('猪八戒')
  // per.setAge(-33)

  console.log(per);
  
  class A{
    protected num:number;
    constructor(num:number){
      this.num = num
    }
  }

  class B extends A{
    test(){
      console.log(this.num);
    }
  }
  
  // 简写
  class C{
    // 可直接将属性定义在构造函数中
    constructor(public name:string , public age:number){
    }
  }
  const c = new C('XXX',111)
  console.log(c);
  
})()